global TaskSwitch
; 功能是将调度切换到下一个任务
TaskSwitch:
    push ebp ; 保存调用者栈帧基址(原EBP值入栈)
    mov ebp, esp ;将当前栈顶(ESP)设为新栈帧基址(EBP)，使得EBP=ESP
    push ebx ; 保存EBX寄存器到当前栈
    push esi ; 保存ESI寄存器到当前栈
    push edi ; 保存EDI寄存器到当前栈
    mov eax, esp ; 将当前栈顶(ESP)存入EAX
    and eax, 0xfffff000 ; 按页对齐(清除低12位)，获取当前任务结构基址，计算出当前任务的起始地址
    mov [eax], esp ; 将当前栈顶保存到[eax]指向的地址，比如任务a=0x1000时，就是让0x1000的内存地址等于栈顶，也就是让任务的stack记录栈顶
    mov eax, [ebp + 8] ; 参数next传入后在 ebp + 8 的位置上，这里将next的地址 拷贝出来给eax
    mov esp, [eax] ; 这里把内存地址[0x1000]位置的值取出赋值给esp，其实就是把上一次保存stack（任务栈顶）取出来恢复给esp，完成栈切换
    pop edi ; 将下一个任务的寄存器恢复
    pop esi
    pop ebx
    pop ebp
    ret ; 这里隐藏了以前讲过的，会将当前栈顶的值赋值给栈顶指针和指令指针（EIP）‌，达到返回后切换任务的作用作用
